#include "stack.h"

// 栈的初始化
int Init_Stack(SqStack ** S)
{
    * S = (SqStack *)malloc(sizeof(SqStack));
    if (NULL == *S)
    {
        ERRLOG("动态空间创建失败");
        exit(EOF);
    }
    memset((*S)->data,0,sizeof(Elenemt_data));
    //-1 空栈  top = -1
    (*S)->top = -1;
    return 0;
}

// 栈的进栈
int Push_Stack(SqStack * S, Elenemt_data data)
{
    if (NULL == S)
    {
        ERRLOG("传入栈为NULL");
        return EOF;
    }
    if (MAX_SIZE == S->top)
    {
        ERRLOG("栈满了");
        return EOF;
    }
    //因为上面定义(*S)->top = -1;此时这里需要先自增再输入数据，如果(*S)->top为0，则先输入数据再自增
    S->top++;
    S->data[S->top] = data;
    return 0;
}

// 栈的出栈
int Pop_Stack(SqStack * S)
{
    if (NULL == S)
    {
        ERRLOG("传入栈为NULL");
        return EOF;
    }
    if (-1 == S->top)
    {
        ERRLOG("栈为空");
        return EOF;
    }
    S->top--;
    return 0;
}

// 栈的读取    只读取栈顶部
int Get_Top(SqStack * S, Elenemt_data * data)
{
    if (NULL == S)
    {
        ERRLOG("传入栈为NULL");
        return EOF;
    }
    if (-1 == S->top)
    {
        ERRLOG("栈为空");
        return EOF;
    }
    // 如果 data 传入的为 NULL则打印当前数据
    if (NULL == data)
    {
        printf("%s\t%s\t%d\t%d\t%d\n", \
               S->data[S->top].name, S->data[S->top].sex, S->data[S->top].age, \
               S->data[S->top].id, S->data[S->top].sco);
    }
    else
    {
        *data = S->data[S->top];
    }
    return 0;
}

// 栈的判空    
int Is_Empty(SqStack * S)
{
    if (NULL == S)
    {
        ERRLOG("传入栈为NULL");
        return EOF;
    }
    if (-1 == S->top)
    {
        // 无数据返回0
        return 0;
    }
    // 有数据 返回非0
    return EOF;
}

// 栈的清空 
int Clear_Stack(SqStack * S)
{
   if (NULL == S)
    {
        ERRLOG("传入栈为NULL");
        return EOF;
    }
    S->top = -1;
    return 0; 
}

// 栈的销毁
int Destroy_Stack(SqStack ** S)
{
    if (NULL == S)
    {
        ERRLOG("传入栈为NULL");
        return EOF;
    }
    free(*S);
    *S = NULL;
    return 0;
}